package com.itheima.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@WebFilter("/*")//一定不要忘记你要过滤的路径
public class LoginCheckFilter  implements Filter{
    ////路径匹配器，支持通配符
    private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //前面我们指定过滤所有的路径
        //在这里我们要将一些无关的页面信息的展示全部放行
        //我们只是想要拦截用户在浏览相关页面时发送的一些请求,如果他没有权限通过请求来浏览相关的数据
        //我们就要将此拦截
        //首先我们先将这些可以放行的页面的路径定义一下
        String[] urls = {
            "/backend/**",
                "/front/**",
                "/employee/login",//这里后面不能加/!!!!!!!!!!!!!!!!!!!!!!!!!
                "/employee/logout",//这里后面不能加/!!!!!!!!!!!!!!!!!!!!!!!!!
                "/common/**",
                "/user/sendMsg",
                "/user/login",
                "/doc.html",
                "/webjars/**",
                "/swagger-resources",
                "/v2/api-docs"
        };
        //然后通过调用方法来进行比对路径


       //先获取请求的路径
        //因为ServletRequest 这个请求类中没有获取路径的方法 所以需要向下强转
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestURI = request.getRequestURI();
        log.info("拦截到请求: {}" ,requestURI);
        boolean check = check(urls, requestURI);
        //如果比对成功 我们就放行
        if(check){
            //输出一下日志来提醒一下
            log.info("本次请求不需要处理: ",request.getRequestURI());
            filterChain.doFilter(request,response);
            return;
        }
        //那么比对不成功的就是些需要有权限才能获得响应的一些请求
        //从发来的请求中我们还得进行判断一下到底有没有权限
        //判断登录状态 如果已经登录则直接放行

//        LoginCheckFilter中存放当前登录用户到ThreadLocal
        if(request.getSession().getAttribute("employeeId")!=null){
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employeeId"));
            //在放行之前 先将id存储到ThreadLocal 当中,
            Long employeeId = (Long) request.getSession().getAttribute("employeeId");
            BaseContext.setCurrentId(employeeId);
            filterChain.doFilter(request,response);
            return;
        }
        // 上面的代码是判断后端的用户是否登录 下面的是判断移动端客户是否登录的
        if(request.getSession().getAttribute("user")!=null){
            Long userId = (Long) request.getSession().getAttribute("user");//这里是在session域中存的是user 所以获取也要用user
            BaseContext.setCurrentId(userId);//将用户id 存入到
            filterChain.doFilter(request,response);
            return;
        }
        //如果走到这里说明用户还没有登录 则没有权限
        log.info("用户未登录");
        //那么要给前端一个响应 告诉用户,你这个操作不规范,你得登录才能看我们的数据
        //前端那边要收Json数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));//为社么这里在返回数据的时候 如果返回的直接是一个字符串的话,就会出现问题呢
        return;

    }
    //创建比对的方法
    public boolean check(String[] urls,String requestURI){
        //先遍历数组
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match){

                return true;
            }
        }

        return false;
    }
}
